home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 41
/
Aminet 41 (2001)(Schatztruhe)[!][Feb 2001].iso
/
Aminet
/
comm
/
misc
/
ClipWatch.lha
/
ClipWatch
/
Sources
/
ClipWatch.c
< prev
next >
Wrap
C/C++ Source or Header
|
2000-12-29
|
52KB
|
1,925 lines
/*
CLIPWATCH
LECTURE DES INFORMATIONS DES TELETRANS CLIP / FORCE (Constructeur WIT)
http://www.wit.fr
Marc Le Douarain , Décembre 1998
mavati@club-internet.fr
http://perso.club-internet.fr/mavati
http://www.multimania.com/mavati
"Conçu" (sur papier) en partie à la résidence des jeunes, St Nazaire.
Dernière mise à jour : 29 décembre 2000
Note : modifs à faire dans ClipWatch_gui.c après génération par MUIBuilder
-Ligne 10 : NON!!!!!!!//#include "ClipWatch_GuiExtern.h"
-Ligne 307: Object->ListEtats => MUIA_List_Title,TRUE,
-Ligne 324: Object->ListJournal => MUIA_List_Title,TRUE,
-Ligne 829: Object->App => MUIA_Application_Version, "$VER:ClipW..... _DATE,
-Ligne 873: 'MUIV_EveryTime' => 2 (Page 2, pour l'Object->ListJournal)
-Ligne 880: 'MUIV_EveryTime' => 1 (Page 1, pour l'Object->ListEtats)
-Ligne 447: rajouter : Child, Object->GraphTrace,
-Ligne 435: rajouter : Object->GraphTrace = NewObject(mccgraph->mcc_Class,NULL,
TextFrame,
MUIA_Background, MUII_BACKGROUND,
TAG_DONE),
Rajouter une ligne avec APTR GraphTrace dans ClipWatch_gui.h
*/
/* Generate the MUI Graphical User Interface */
/* (stdio is faster for tests...!) */
#define GENERATE_GUI
/* We are under developpement... */
// #define DEBUG
#include <exec/types.h>
#include <devices/serial.h>
#include <dos/dos.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <clib/alib_protos.h>
#include <clib/dos_protos.h>
#include <clib/exec_protos.h>
#include <clib/intuition_protos.h>
#define VERSION "0.8.2"
#define COMPILATION_DATE __DATE__
#include "trsii.h"
#ifdef GENERATE_GUI
#include "MUI_demo.h"
#endif
int TeletransOnLine=FALSE;
int TeletransOnCall=FALSE;
struct InfosTeletrans Teletrans;
struct Ressources * Ress;
int RefreshType;
int RefreshParam;
char * MessagesBox[NBR_MESSAGESBOX];
char * MessagesBoxMemZone;
struct Traces Tra[NBR_TRACES];
char * TabLibellesTraces[NBR_TRACES]; /* Only for the init of the cycle gadget of MUI */
struct Evenements * Jrnl;
int JrnlTaille=0;
char Even_Journal[256];
long NumLastEven_Journal;
char Param_Trace[256];
char DateLastEven_Journal[20];
struct Str_AffiTraceGraph TraceGraph;
//time_t * TraHorodates=NULL;
//double * TraValeurs=NULL;
//long TraNbrSamples=0;
//time_t TraTime32Deb,TraTime32Fin;
struct Str_AffiGraphGene AffiGraphGene;
long MoniteurMode=1;
#ifndef DEBUG
long MoniteurActif=FALSE;
long RecupDesMessages=TRUE;
#else
long MoniteurActif=TRUE;
long RecupDesMessages=FALSE;
#endif
long RecupDuJournal=FALSE;
long RecupDesTraces=TRUE;
char * ListeSitesConnus=NULL;
char * TrameRecue;
char SerialDevice[50]="serial.device";
int SerialUnit=0;
int SerialSpeed=1200;
int SerialInitOk=FALSE; /* Flag set if the serial device is open. */
struct MsgPort *SerialMP = NULL; /* Port for replies to io messages to go to. */
struct IOExtSer *SerialIO = NULL; /* Data structure used for messages to device. */
struct IOExtSer *IncomingIO = NULL; /* Structure for incoming characters. */
/* with GCC without libnix (-noixemul) */
struct Library *IntuitionBase = NULL;
struct Library *GfxBase = NULL;
struct Library *UtilityBase = NULL;
#ifdef GENERATE_GUI
struct ObjApp * App = NULL;
static APTR WI_AboutMUI;
struct MUI_CustomClass *mccgraph;
#endif
void ErrorMessageRequest(char *string);
void DisplayStatus(char *string);
void convert_long_to_asciidate(time_t tps,char * ch,char * ch_time);
#ifdef GENERATE_GUI
#include "GraphClass.c"
#include "ClipWatch_Gui.c"
#endif
#include "strings.c"
#include "serial-modem.c"
#include "trsii.c"
#include "misc.c"
void DisplayStatus(char *string)
{
#ifndef GENERATE_GUI
printf("%s\n",string);
#else
set(App->ComState,MUIA_Text_Contents,string);
#endif
}
void ErrorMessageRequest(char *string)
{
#ifndef GENERATE_GUI
printf("%s\n",string);
#else
MUI_Request(App->App, App->WI_Main, 0, NULL, "OK", string);
DisplayStatus("");
#endif
}
/* ################################################ */
/* Ajout d'un événement dans le Journal (structure) */
/* ################################################ */
int AddEvenInJrnl(char * Even,int RefreshList)
{
char * EvenOffset;
int Ok=FALSE;
int i;
int NewMemAlloc=FALSE;
// long ActiveEntryInJrnl;
JrnlTaille++;
// On alloue 100 evens par 100 evens pour limiter le nbr de reconstruction de la liste...
if ( (((JrnlTaille-1)%100)==0) || (Jrnl==NULL) )
{
Jrnl=(struct Evenements *)realloc(Jrnl,(JrnlTaille+100)*sizeof(struct Evenements));
if (Jrnl==NULL)
{
ErrorMessageRequest("Could not alloc enough memory (for evenements)");
Appli_CloseAll();
exit(30);
}
else
{
NewMemAlloc=TRUE;
}
}
if (Jrnl)
{
strcpy_termnotnull(Jrnl[JrnlTaille-1].Index,Even,9,0);
sprintf(Jrnl[JrnlTaille-1].Date,"%c%c/%c%c/%c%c%c%c %c%c:%c%c:%c%c",Even[11],Even[12],Even[9],Even[10],Even[5],Even[6],Even[7],Even[8],Even[13],Even[14],Even[15],Even[16],Even[17],Even[18]);
EvenOffset=str_field(Even,128,5,9);
if (EvenOffset)
strcpy_termnotnull(Jrnl[JrnlTaille-1].NumRess,EvenOffset,9,0);
EvenOffset=str_field(Even,128,6,9);
if (EvenOffset)
strcpy_termnotnull(Jrnl[JrnlTaille-1].LibelleRess,EvenOffset,9,0);
EvenOffset=str_field(Even,128,8,9);
if (EvenOffset)
strcpy_termnotnull(Jrnl[JrnlTaille-1].EtatRess,EvenOffset,9,0);
EvenOffset=str_field(Even,128,9,9);
if (EvenOffset)
{
Jrnl[JrnlTaille-1].Classe[0]=EvenOffset[1];
Jrnl[JrnlTaille-1].Classe[1]='\0';
Jrnl[JrnlTaille-1].Zone[0]=EvenOffset[4];
Jrnl[JrnlTaille-1].Zone[1]='\0';
Jrnl[JrnlTaille-1].Code[0]=EvenOffset[7];
Jrnl[JrnlTaille-1].Code[1]='\0';
Ok=TRUE;
#ifdef GENERATE_GUI
if (NewMemAlloc)
{
/* Comme il y a eu un REALLOC, il faut tout recréer la liste : pointeurs vers
chaines plus valides */
// get(App->ListJournal,MUIA_List_Active,&ActiveEntryInJrnl);
if (RefreshList)
set(App->ListJournal,MUIA_List_Quiet,TRUE);
DoMethod(App->ListJournal,MUIM_List_Clear);
for(i=0;i<JrnlTaille;i++)
{
DoMethod(App->ListJournal,MUIM_List_InsertSingle,&Jrnl[i],MUIV_List_Insert_Bottom);
}
if (RefreshList)
set(App->ListJournal,MUIA_List_Quiet,FALSE);
// if (ActiveEntryInJrnl>-1)
// set(App->ListJournal,MUIA_List_Active,ActiveEntryInJrnl);
}
else
{
DoMethod(App->ListJournal,MUIM_List_InsertSingle,&Jrnl[JrnlTaille-1],MUIV_List_Insert_Bottom);
}
if (RefreshList)
set(App->ListJournal,MUIA_List_Active,MUIV_List_Active_Bottom);
#endif
}
}
return Ok;
}
/* ######################################################################### */
/* Génération du gadget MUI Cycle, contenant la liste des traces disponibles */
/* ######################################################################### */
#ifdef GENERATE_GUI
void UpdateMUICycleTraces(void)
{
int i,j=0;
for (i=1;i<NBR_TRACES;i++)
{
/* Trace paramétrée ? (pour affichage dans gadget Cycle MUI) */
if(Tra[i].Used=='M')
{
TabLibellesTraces[j]=Tra[i].NumMenu;
j++;
}
}
/* Dernière entrée de la liste de pointeurs : NULL */
TabLibellesTraces[j]=NULL;
set(App->ChoixTraces,MUIA_Cycle_Entries,TabLibellesTraces);
set(App->ChoixTraces,MUIA_Cycle_Active,0);
}
/* Renvoie le numéro de la ligne sélectionnée qui servira à se positionner
dans un gadget Cycle selon la chaine désirée */
/* En entrée : tableau de pointeurs de chaines du cycle */
/* : pointeur sur la chaine recherchée */
int GetMUICycleToSet(char ** CycleDataPtr,char * Wanted)
{
int num=0;
int Fnd=FALSE;
char * ptchaine;
do
{
ptchaine=CycleDataPtr[num];
if (strcmp(ptchaine,Wanted)==0)
Fnd=TRUE;
if (!Fnd)
{
num++;
}
}
while( (*ptchaine!=NULL) && (!Fnd) );
if (!Fnd)
num=0;
return num;
}
/* Renvoie un pointeur sur le contenu du gadget Cycle sélectionné */
/* En entrée : tableau de pointeurs de chaines du cycle */
/* : entier sur la sélection du cycle */
char * GetMUICycleString(char ** CycleDataPtr, int NumCycleSelected)
{
int num=0;
char * ptchaine=CycleDataPtr[num];
if (NumCycleSelected>0)
{
do
{
num++;
ptchaine=CycleDataPtr[num];
}
while( (num<NumCycleSelected) && (*ptchaine!=0) );
}
return ptchaine;
}
#endif
/* ----------------------------------------- */
/* Lecture depuis le disque du fichier trace */
/* ----------------------------------------- */
long load_trace_fm_disk(char * Fichier,time_t StartHorodate,time_t EndHorodate)
{
FILE * FTrace;
time_t TimeSampleDiskBalayage;
long i=0;
time_t * Horodates;
double * Valeurs;
if (TraceGraph.Horodates==NULL)
Horodates=(time_t *)malloc(sizeof(time_t)*2500);
else
Horodates=TraceGraph.Horodates;
if (TraceGraph.Valeurs==NULL)
Valeurs=(double *)malloc(sizeof(double)*2500);
else
Valeurs=TraceGraph.Valeurs;
if ( (Horodates==NULL) || (Valeurs==NULL) )
return(0);
TraceGraph.Horodates=Horodates;
TraceGraph.Valeurs=Valeurs;
FTrace=fopen(Fichier,"rb");
if (FTrace)
{
double ValSample;
int FinFic;
/* Recherche du 1er échantillon */
do
{
FinFic=fread(&TimeSampleDiskBalayage,sizeof(time_t),1,FTrace);
if (FinFic!=0)
fread(&ValSample,sizeof(double),1,FTrace);
}
while( (FinFic!=0) && (TimeSampleDiskBalayage<StartHorodate) );
/* Remplissage de la mémoire avec les échantillons demandés */
if (FinFic!=0)
{
do
{
FinFic=fread(&TimeSampleDiskBalayage,sizeof(time_t),1,FTrace);
if (FinFic!=0)
{
Horodates[i]=TimeSampleDiskBalayage;
FinFic=fread(&ValSample,sizeof(double),1,FTrace);
if (FinFic!=0)
{
Valeurs[i]=ValSample;
if (TimeSampleDiskBalayage<EndHorodate)
i++;
if (i>=2500)
{
/* TEMPORAIRE a revoir */
printf("Memory Overflow... Partie chargement de trace\n");
exit(30);
}
}
}
}
while( (FinFic!=0) && (TimeSampleDiskBalayage<EndHorodate) );
}
fclose(FTrace);
}
return(i);
}
/* ---------------------------------------------- */
/* Libération de la mémoire utilisée par la trace */
/* ---------------------------------------------- */
void free_trace(time_t * Horodates[],double * Valeurs[])
{
if (*Horodates)
{
free((void *)*Horodates);
*Horodates=NULL;
}
if (*Valeurs)
{
free((void *)*Valeurs);
*Valeurs=NULL;
}
}
/* ----------------------------------------------- */
/* Affichage de la trace sous forme numérique dans */
/* le list-view */
/* ----------------------------------------------- */
void show_trace_digital(int LibererMem,long NbrSmp,time_t TabHD[],double TabVal[])
{
static struct AffiTraceNum * TraceAscii=NULL;
static long TailleMemTrace;
long i;
/* Quelque chose à afficher ? */
if (NbrSmp==0)
{
#ifdef GENERATE_GUI
DoMethod(App->ListTraceNum,MUIM_List_Clear);
#endif
}
else
{
/* Allocation mémoire */
/* si première fois ou plus d'échantillons à afficher que précédement */
if ( (NbrSmp!=TailleMemTrace) || (TraceAscii==NULL) )
{
if (TraceAscii)
{
free(TraceAscii);
TraceAscii=NULL;
}
if (TraceAscii==NULL)
{
TraceAscii=(struct AffiTraceNum *)malloc(sizeof(struct AffiTraceNum)*NbrSmp);
TailleMemTrace=NbrSmp;
}
}
if (TraceAscii!=NULL)
{
/* Conversion en ascii pour affichage */
for(i=0;i<NbrSmp;i++)
{
convert_long_to_asciidate(TabHD[i],TraceAscii[i].Date,TraceAscii[i].Heure);
sprintf(TraceAscii[i].Valeur," %f",TabVal[i]);
}
/* Allez zouc, tout ça dans le list-view */
#ifdef GENERATE_GUI
set(App->ListTraceNum,MUIA_List_Quiet,TRUE);
DoMethod(App->ListTraceNum,MUIM_List_Clear);
for(i=0;i<NbrSmp;i++)
{
DoMethod(App->ListTraceNum,MUIM_List_InsertSingle,&TraceAscii[i],MUIV_List_Insert_Bottom);
}
set(App->ListTraceNum,MUIA_List_Quiet,FALSE);
set(App->ListTraceNum,MUIA_List_Active,MUIV_List_Active_Bottom);
#endif
}
}
}
/* Return the 32 bits value of time in locale !!! */
time_t timenow(void)
{
time_t t;
struct tm *p;
time(&t); // en GMT...
p=localtime(&t);
return (mktime(p));
}
/* ----------------------------------------------------------- */
/* Conversion d'une valeur 32 bits en chaines ascii JJ/MM/AAAA */
/* et HH:MM:SS si pointeur sur deuxième chaine non NULL */
/* ----------------------------------------------------------- */
void convert_long_to_asciidate(time_t tps,char * ch,char * ch_time)
{
struct tm *UnpackT;
UnpackT = localtime(&tps);
sprintf(ch,"%02d/%02d/%04d",UnpackT->tm_mday,UnpackT->tm_mon+1,1900+UnpackT->tm_year);
if (ch_time)
sprintf(ch_time,"%02d:%02d:%02d",UnpackT->tm_hour,UnpackT->tm_min,UnpackT->tm_sec);
}
/* -------------------------------------------------------------- */
/* Conversion de chaines ascii JJ/MM/AAAA et HH:MM:SS si deuxième */
/* pointeur non NULL, en valeur 32 bits de temps */
/* -------------------------------------------------------------- */
time_t convert_asciidate_to_long(char * ch,char * ch_time)
{
struct tm DateEnClair;
int Annee;
int Mois;
int Jour;
int Heure=0,Minute=0,Seconde=0;
int Offset=0;
int Valide=TRUE;
int ValideH;
time_t TimeRes=0;
/* LA DATE JJ/MM/AA */
/* Recherche du jour */
if ( (ch[Offset+1]=='/') || (ch[Offset+2]=='/') )
{
Jour=atoi(&ch[Offset]);
Offset=Offset+2;
if (ch[Offset]=='/')
Offset++;
}
else
{
Valide=FALSE;
}
/* Recherche du mois */
if ( (ch[Offset+1]=='/') || (ch[Offset+2]=='/') )
{
Mois=atoi(&ch[Offset]);
Offset=Offset+2;
if (ch[Offset]=='/')
Offset++;
}
else
{
Valide=FALSE;
}
/* Recherche de l'année */
if (Valide)
{
Annee = atoi(&ch[Offset]);
/* Année sur 2 chiffres ? */
if (ch[Offset+2]=='\0')
{
Annee = Annee+1900;
}
Annee = Annee - 1900;
}
/* L'HORAIRE HH:MM:SS */
if (ch_time)
ValideH=TRUE;
if (ValideH)
{
Offset=0;
/* Recherche de l'heure */
if ( (ch_time[Offset+1]==':') || (ch_time[Offset+2]==':') )
{
Heure=atoi(&ch_time[Offset]);
Offset=Offset+2;
if (ch_time[Offset]==':')
Offset++;
}
else
{
ValideH=FALSE;
}
/* Recherche de la minute */
if ( (ch_time[Offset+1]==':') || (ch_time[Offset+2]==':') ||
(ch_time[Offset+2]=='\0') || (ch_time[Offset+2]=='\0') )
{
Minute=atoi(&ch_time[Offset]);
Offset=Offset+2;
if (ch_time[Offset]==':')
Offset++;
}
else
{
ValideH=FALSE;
}
/* Recherche des secondes (facultatif!) */
if (ValideH)
{
Seconde=atoi(&ch_time[Offset]);
}
}
/* CALCUL DE LA VALEUR 32 BITS */
if (Valide)
{
DateEnClair.tm_year = Annee;
DateEnClair.tm_mon = Mois - 1;
DateEnClair.tm_mday = Jour;
DateEnClair.tm_isdst = 0; /*1;*/
if (ValideH)
{
DateEnClair.tm_hour = Heure;
DateEnClair.tm_min = Minute;
DateEnClair.tm_sec = Seconde;
}
else
{
DateEnClair.tm_hour = 0;
DateEnClair.tm_min = 0;
DateEnClair.tm_sec = 0;
}
TimeRes = mktime(&DateEnClair);
}
return TimeRes;
}
/* Affichage de la trace */
void show_trace(int NumTrace,time_t StartT,time_t EndT)
{
long NbrSamples;
// long i;
char FichierTrace[256];
sprintf(FichierTrace,"Sites/%s/Trace%03d",Teletrans.SiteName,NumTrace);
NbrSamples=load_trace_fm_disk(FichierTrace,StartT,EndT); /*,&TraHorodates,&TraValeurs);*/
TraceGraph.NbrSamples=NbrSamples;
show_trace_digital(FALSE,NbrSamples,TraceGraph.Horodates,TraceGraph.Valeurs);
// for (i=0;i<NbrSamples;i++)
// {
// printf("Sample #%d => Date:%s (time_t=%u) Valeur:%f\n",i,ctime(&TraHorodates[i]),TraHorodates[i],TraValeurs[i]);
// }
}
#ifdef GENERATE_GUI
void refresh_trace_wanted(int NumTraceDemande,long GlissementDates)
{
int NumCycle;
int NumTrace;
char * DateDeb;
char * TempsDeb;
char * DateFin;
char * TempsFin;
time_t Tps32Deb,Tps32Fin;
/* n° de trace actuellement affichée ? */
get(App->ChoixTraces,MUIA_Cycle_Active,&NumCycle);
NumTrace=atoi(TabLibellesTraces[NumCycle]);
/* Trace demandée = sélectionnée ?*/
if ( (NumTraceDemande==NumTrace) || (NumTraceDemande==0) )
{
int RfshAffiDates=FALSE;
long TailleTps;
time_t TailleTps32;
time_t Tab[5]={24*3600,2*24*3600,7*24*3600,31*24*3600,0};
get(App->Trace_DateStart,MUIA_String_Contents,&DateDeb);
get(App->Trace_TimeStart,MUIA_String_Contents,&TempsDeb);
get(App->Trace_DateEnd,MUIA_String_Contents,&DateFin);
get(App->Trace_TimeEnd,MUIA_String_Contents,&TempsFin);
Tps32Deb=convert_asciidate_to_long(DateDeb,TempsDeb);
Tps32Fin=convert_asciidate_to_long(DateFin,TempsFin);
/* Taille de la plage temporelle affichée */
get(App->Trace_Range,MUIA_Cycle_Active,&TailleTps);
TailleTps32=Tab[TailleTps];
/* Demande de nouvelles dates de type 'Down' */
if (GlissementDates==ID_TRACE_RANGEDOWN)
{
time_t ZoneTpsAutre;
RfshAffiDates=TRUE;
if (TailleTps32!=0)
{
Tps32Fin=Tps32Deb;
Tps32Deb=Tps32Deb-TailleTps32;
}
else
{
ZoneTpsAutre=Tps32Fin-Tps32Deb;
Tps32Fin=Tps32Deb;
Tps32Deb=Tps32Deb-ZoneTpsAutre;
}
}
/* Demande de nouvelles dates de type 'Up' */
if (GlissementDates==ID_TRACE_RANGEUP)
{
time_t ZoneTpsAutre;
RfshAffiDates=TRUE;
if (TailleTps32!=0)
{
Tps32Deb=Tps32Fin;
Tps32Fin=Tps32Fin+TailleTps32;
}
else
{
ZoneTpsAutre=Tps32Fin-Tps32Deb;
Tps32Deb=Tps32Fin;
Tps32Fin=Tps32Fin+ZoneTpsAutre;
}
}
/* Demande de nouvelle plage temporelle, on recale le temps de fin */
/* -ou- Saisie d'une nouvelle date de début, on recale la fin */
if ( (GlissementDates==ID_TRACE_NEWRANGE) || (GlissementDates==ID_TRACE_START) )
{
if (TailleTps32!=0)
{
RfshAffiDates=TRUE;
Tps32Fin=Tps32Deb+TailleTps32;
}
}
/* Saisie d'une nouvelle date de fin, on recale le début */
if (GlissementDates==ID_TRACE_END)
{
if (TailleTps32!=0)
{
RfshAffiDates=TRUE;
Tps32Deb=Tps32Fin-TailleTps32;
}
}
/* Mise à jour des champs dates à l'écran */
if (RfshAffiDates)
{
char tmp[20];
char tmp2[10];
convert_long_to_asciidate(Tps32Deb,tmp,tmp2);
set(App->Trace_DateStart,MUIA_String_Contents,tmp);
set(App->Trace_TimeStart,MUIA_String_Contents,tmp2);
convert_long_to_asciidate(Tps32Fin,tmp,tmp2);
set(App->Trace_DateEnd,MUIA_String_Contents,tmp);
set(App->Trace_TimeEnd,MUIA_String_Contents,tmp2);
AffiGraphGene.Time32Deb=Tps32Deb;
AffiGraphGene.Time32Fin=Tps32Fin;
}
show_trace(NumTrace,Tps32Deb,Tps32Fin);
// DoMethod(App->GraphTrace,MUIM_Draw,MADF_DRAWOBJECT);
// MUI_Redraw(App->GraphTrace,MADF_DRAWOBJECT);
set(App->GraphTrace,SHOW_GRAPH,&TraceGraph);
}
}
#endif
/* ############################################################# */
/* Choix d'un site, ou recherche du site avec lequel on vient de
se connecter sur le disque */
/* ############################################################# */
int SelectSite(void)
{
struct FileLock * DirSite;
char DrawerNameSite[256];
FILE * PtrFileJrnlLoad;
FILE * PtrFileRessLoad;
FILE * PtrFileTraLoad;
char FileName[256];
int Fin;
int i;
char StringFile[256];
char * StrTraceOffset;
int ParamsOfSiteFnd=FALSE;
#ifndef GENERATE_GUI
printf("Nom du site:%s - Type:%s - Version:%s\n",Teletrans.SiteName,Teletrans.Type,Teletrans.Version);
#else
set(App->SiteName,MUIA_Text_Contents,Teletrans.SiteName);
set(App->Type,MUIA_Text_Contents,Teletrans.Type);
set(App->Version,MUIA_Text_Contents,Teletrans.Version);
set(App->NumTelephone,MUIA_String_Contents,Teletrans.NumTel);
#endif
/* Nettoyage Messages */
#ifdef GENERATE_GUI
set(App->MessageTextNum0,MUIA_String_Contents,"");
set(App->MessageTextNum1,MUIA_String_Contents,"");
set(App->MessageTextNum2,MUIA_String_Contents,"");
set(App->MessageTextNum3,MUIA_String_Contents,"");
set(App->MessageTextNum4,MUIA_String_Contents,"");
set(App->MessageTextNum5,MUIA_String_Contents,"");
set(App->MessageTextNum6,MUIA_String_Contents,"");
set(App->MessageTextNum7,MUIA_String_Contents,"");
#endif
/* Nettoyage Liste Journal et Liste Etats */
#ifdef GENERATE_GUI
DoMethod(App->ListJournal,MUIM_List_Clear);
DoMethod(App->ListEtats,MUIM_List_Clear);
set(App->ListEtats,MUIA_List_Quiet,TRUE);
#endif
/* Initialisation chaines Libellés/Etats des ressources */
i=0;
do
{
Ress[i].Libelle[0]='\0';
Ress[i].Etat[0]='\0';
#ifdef GENERATE_GUI
DoMethod(App->ListEtats ,MUIM_List_InsertSingle,&Ress[i],MUIV_List_Insert_Bottom);
#endif
i++;
}
while(i<Teletrans.NumRessourcesMax);
#ifdef GENERATE_GUI
set(App->ListEtats,MUIA_List_Quiet,FALSE);
#endif
/* Initialisation du journal */
NumLastEven_Journal=-1;
DateLastEven_Journal[0]='\0';
JrnlTaille=0;
if (Jrnl)
{
free(Jrnl);
Jrnl=NULL;
}
/* On regarde sur le disque dur si on connait ce site ... */
strcpy(DrawerNameSite,"Sites/");
strcat(DrawerNameSite,Teletrans.SiteName);
DirSite= (struct FileLock *)Lock(DrawerNameSite,ACCESS_READ);
if (DirSite!=NULL)
{
/* Site connu */
/*------------*/
UnLock((BPTR) DirSite);
/* Lecture des libellés des ressources sauvés sur le disque */
strcpy(FileName,"Sites/");
strcat(FileName,Teletrans.SiteName);
strcat(FileName,"/Ressources.txt");
PtrFileRessLoad=fopen(FileName,"rt");
if (PtrFileRessLoad!=NULL)
{
i=0;
do
{
Fin=(int)fgets(StringFile,255,PtrFileRessLoad);
if (Fin!=0)
{
strcpy_termnotnull(Ress[i].Libelle,StringFile,10,0);
}
i++;
}
while((Fin!=0)&&(i<NBR_RESSOURCES));
fclose(PtrFileRessLoad);
ParamsOfSiteFnd=TRUE;
#ifdef GENERATE_GUI
DoMethod(App->ListEtats,MUIM_List_Redraw,MUIV_List_Redraw_All);
#endif
}
/* Lecture du journal sauvé sur le disque */
strcpy(FileName,"Sites/");
strcat(FileName,Teletrans.SiteName);
strcat(FileName,"/Journal.txt");
PtrFileJrnlLoad=fopen(FileName,"rt");
if (PtrFileJrnlLoad!=NULL)
{
#ifdef GENERATE_GUI
set(App->ListJournal,MUIA_List_Quiet,TRUE);
#endif
do
{
Fin=(int)fgets(StringFile,255,PtrFileJrnlLoad);
if (Fin!=0)
{
NumLastEven_Journal=atol(StringFile);
strcpy_termnotnull(DateLastEven_Journal,StringFile+5,9,0);
AddEvenInJrnl(StringFile,FALSE);
}
}
while(Fin!=0);
fclose(PtrFileJrnlLoad);
#ifdef GENERATE_GUI
set(App->ListJournal,MUIA_List_Quiet,FALSE);
#endif
}
/* Lecture du paramétrage des traces sauvé sur le disque */
strcpy(FileName,"Sites/");
strcat(FileName,Teletrans.SiteName);
strcat(FileName,"/Traces.txt");
PtrFileTraLoad=fopen(FileName,"rt");
if (PtrFileTraLoad!=NULL)
{
i=1;
do
{
Fin=(int)fgets(StringFile,255,PtrFileTraLoad);
if (Fin!=0)
{
if(strlen(StringFile)>1)
{
Tra[i].Used='M';
strcpy_termnotnull(Tra[i].NumMenu,StringFile,9,0);
Tra[i].NumMenu[3]=' ';
Tra[i].NumMenu[4]='-';
Tra[i].NumMenu[5]=' ';
StrTraceOffset=str_field(StringFile,128,10,'\t');
if (StrTraceOffset)
{
strcpy_termnotnull(Tra[i].Libelle,StrTraceOffset,'\n','\t');
}
}
else
{
Tra[i].Used='A';
}
}
i++;
}
while((Fin!=0)&&(i<NBR_TRACES));
fclose(PtrFileTraLoad);
#ifdef GENERATE_GUI
UpdateMUICycleTraces();
refresh_trace_wanted(0,NULL); // Refresh de la trace sélectionnée
#endif
}
else
{
ParamsOfSiteFnd=FALSE;
}
}
return ParamsOfSiteFnd;
}
#ifdef GENERATE_GUI
void ChoixSiteConnu(void)
{
long NumSiteChoisi;
char * NomSite=ListeSitesConnus;
int i;
char FileName[256];
char tmp[50];
get(App->ListSavedSites,MUIA_List_Active,&NumSiteChoisi);
// On cherche la chaine correspondante
if (ListeSitesConnus)
{
for(i=0;i<NumSiteChoisi;i++)
{
do
{
NomSite++;
}
while(*NomSite!='\0');
NomSite++;
}
strcpy(Teletrans.SiteName,NomSite);
strcpy(FileName,"Sites/");
strcat(FileName,Teletrans.SiteName);
strcat(FileName,"/InfosSite.txt");
ReadStringParamIni("TYPE","???",Teletrans.Type,FileName);
ReadStringParamIni("VERSION","???",Teletrans.Version,FileName);
ReadStringParamIni("TRSII_EXTENDED","FALSE",tmp,FileName);
if (strcmp(tmp,"FALSE")==0)
Teletrans.TRSII_Extended_Clip=FALSE;
else
Teletrans.TRSII_Extended_Clip=TRUE;
Teletrans.NumRessourcesMax=ReadIntParamIni("RESSOURCES_NBR",100,FileName);
Teletrans.NumTracesMax=ReadIntParamIni("TRACES_NBR",20,FileName);
ReadStringParamIni("TELEPHONE","",Teletrans.NumTel,FileName);
SelectSite();
}
}
#endif
#ifdef GENERATE_GUI
/* ######################################################
Mise à jour de la fenêtre contenant la liste des sites
déjà appelés et sauvegardés sur le disque
###################################################### */
void MiseAJourListeSitesConnus(void)
{
BPTR DirLock;
struct FileInfoBlock FileInfo;
char PasLaFin=TRUE;
char SiteTmp[200];
long LgtSites=0;
int NbrSites=0;
int SiteActuel=-1;
int i;
if (ListeSitesConnus!=NULL)
{
free(ListeSitesConnus);
ListeSitesConnus=NULL;
}
DirLock=Lock("Sites",ACCESS_READ);
if(DirLock)
{
PasLaFin=Examine(DirLock,&FileInfo);
if (PasLaFin)
{
do
{
PasLaFin=ExNext(DirLock,&FileInfo);
if (PasLaFin)
{
if (FileInfo.fib_DirEntryType>0) // c'est un répertoire ?
{
strcpy(SiteTmp,FileInfo.fib_FileName);
if (strcmp(Teletrans.SiteName,SiteTmp)==0)
SiteActuel=NbrSites;
NbrSites++;
// On est obligé de conserver les chaines en mémoire car MUI utilise un pointeur
// sur la chaine passée en argument lors du DoMethod...
if (ListeSitesConnus)
{
ListeSitesConnus=realloc(ListeSitesConnus,LgtSites+strlen(SiteTmp)+1);
}
else
{
ListeSitesConnus=malloc(strlen(SiteTmp)+1);
ListeSitesConnus[0]=0;
}
if (ListeSitesConnus)
{
strcpy(ListeSitesConnus+LgtSites,SiteTmp);
LgtSites=LgtSites+strlen(SiteTmp)+1;
}
}
}
}
while(PasLaFin);
}
UnLock(DirLock);
}
DoMethod(App->ListSavedSites,MUIM_List_Clear);
// On est obligé de le faire maintenant et on ne peux pas le faire au fur et à mesure
// car les realloc empechent d'avoir les pointeurs sur les chaînes de stables...
if (NbrSites)
{
char * NomSite=ListeSitesConnus;
for (i=0;i<NbrSites;i++)
{
DoMethod(App->ListSavedSites,MUIM_List_InsertSingle,NomSite,MUIV_List_Insert_Bottom);
do
{
NomSite++;
}
while(*NomSite!='\0');
NomSite++;
}
if (SiteActuel!=-1)
set(App->ListSavedSites,MUIA_List_Active,SiteActuel);
}
}
#endif
/* ############################### */
/* # GESTION DU RAFRAICHISSEMENT # */
/* # SUITE AUX DONNES RECUES # */
/* ############################### */
void gestion_refresh(char * EndOfStep,char * ParamFoundOnDisk,char FirstPassageInStep)
{
struct FileLock * DirSite;
char DrawerNameSite[256];
FILE * PtrFileJrnlSave;
FILE * PtrFileRessSave;
FILE * PtrFileTraSave;
char FileName[300];
char NumEvenStr[16];
char tmp[50];
if (RefreshType==RFH_IDENTITE)
{
int Fnd;
Fnd=SelectSite();
*ParamFoundOnDisk=Fnd;
if (!Fnd)
{
/* Nouveau site */
/*--------------*/
strcpy(DrawerNameSite,"Sites/");
strcat(DrawerNameSite,Teletrans.SiteName);
DirSite=(struct FileLock *)CreateDir(DrawerNameSite);
if (DirSite!=NULL)
{
UnLock((BPTR) DirSite);
/* Sauvegarde des infos concernant le site */
WriteStringParamIni("TYPE",Teletrans.Type,"T:ClipWatchCurrentSite");
WriteStringParamIni("VERSION",Teletrans.Version,"T:ClipWatchCurrentSite");
if (Teletrans.TRSII_Extended_Clip==FALSE)
strcpy(tmp,"FALSE");
else
strcpy(tmp,"TRUE");
WriteStringParamIni("TRSII_EXTENDED",tmp,"T:ClipWatchCurrentSite");
WriteIntParamIni("RESSOURCES_NBR",Teletrans.NumRessourcesMax,"T:ClipWatchCurrentSite");
WriteIntParamIni("TRACES_NBR",Teletrans.NumTracesMax,"T:ClipWatchCurrentSite");
WriteStringParamIni("TELEPHONE",Teletrans.NumTel,"T:ClipWatchCurrentSite");
strcpy(FileName,"copy T:ClipWatchCurrentSite \"Sites/");
strcat(FileName,Teletrans.SiteName);
strcat(FileName,"/InfosSite.txt\"");
system(FileName);
remove("T:ClipWatchCurrentSite");
/* On met à jour la liste des sites connus */
#ifdef GENERATE_GUI
MiseAJourListeSitesConnus();
#endif
}
else
{
ErrorMessageRequest("Nouveau site impossible à créer");
}
}
}
if (RefreshType==RFH_DATE)
{
#ifndef GENERATE_GUI
printf("Date locale:%s\n",Teletrans.LocalDate);
#else
set(App->Date,MUIA_Text_Contents,Teletrans.LocalDate);
#endif
}
if (RefreshType==RFH_TIME)
{
#ifndef GENERATE_GUI
printf("Heure locale:%s\n",Teletrans.LocalTime);
#else
set(App->Time,MUIA_Text_Contents,Teletrans.LocalTime);
#endif
}
if (RefreshType==RFH_JOURNAL)
{
/* Plus d'événement ? */
if (strcmp(Even_Journal,"FIN")==0)
{
*EndOfStep=TRUE;
}
else
{
strcpy_termnotnull(NumEvenStr,Even_Journal,13,9);
/* Lors de la première lecture via la date, il faut vérifier qu'il s'agit
bien d'un événement inconnu */
if ( (!FirstPassageInStep) || (NumLastEven_Journal!=atol(NumEvenStr)) )
{
#ifndef GENERATE_GUI
printf("%s\n",Even_Journal);
#else
AddEvenInJrnl(Even_Journal,TRUE);
#endif
/* Sauvegarde sur le disque de l'événement */
strcpy(FileName,"Sites/");
strcat(FileName,Teletrans.SiteName);
strcat(FileName,"/Journal.txt");
PtrFileJrnlSave=fopen(FileName,"at");
if (PtrFileJrnlSave!=NULL)
{
fprintf(PtrFileJrnlSave,"%s\n",Even_Journal);
fclose(PtrFileJrnlSave);
}
else
{
ErrorMessageRequest("Sauvegarde journal impossible");
*EndOfStep=TRUE;
}
NumLastEven_Journal=atol(NumEvenStr);
}
}
}
if (RefreshType==RFH_LIBELLE_RESS)
{
strcpy(FileName,"Sites/");
strcat(FileName,Teletrans.SiteName);
strcat(FileName,"/Ressources.txt");
#ifdef GENERATE_GUI
DoMethod(App->ListEtats,MUIM_List_Redraw,RefreshParam);
#endif
/* Si première ressource, init.fichier sinon rajout */
if (RefreshParam>0)
{
PtrFileRessSave=fopen(FileName,"at");
}
else
{
PtrFileRessSave=fopen(FileName,"wt");
}
if (PtrFileRessSave!=NULL)
{
fprintf(PtrFileRessSave,"%s\n",Ress[RefreshParam].Libelle);
fclose(PtrFileRessSave);
}
else
{
if (RefreshParam==0)
{
ErrorMessageRequest("Sauvegarde libellés ressources impossible");
}
}
/* Dernière ressource ? */
if (RefreshParam==Teletrans.NumRessourcesMax-1)
{
*EndOfStep=TRUE;
}
}
if (RefreshType==RFH_PARAM_TRACE)
{
/* Plus de traces (dépassement capacité télétrans en nbr de traces) ? */
if (RefreshParam==0)
{
*EndOfStep=TRUE;
}
strcpy(FileName,"Sites/");
strcat(FileName,Teletrans.SiteName);
strcat(FileName,"/Traces.txt");
/* Si première trace, init.fichier sinon rajout */
if (RefreshParam>1)
{
PtrFileTraSave=fopen(FileName,"at");
}
else
{
PtrFileTraSave=fopen(FileName,"wt");
}
if (PtrFileTraSave!=NULL)
{
fprintf(PtrFileTraSave,"%s\n",Param_Trace);
fclose(PtrFileTraSave);
}
else
{
if (RefreshParam==1)
{
ErrorMessageRequest("Sauvegarde paramétrage traces impossible");
}
}
/* Dernière trace ? */
if (RefreshParam==Teletrans.NumTracesMax-1)
{
/* Rafraichissement du gadget cyclique contenant tous les noms de traces */
#ifdef GENERATE_GUI
UpdateMUICycleTraces();
#endif
*EndOfStep=TRUE;
}
}
if (RefreshType==RFH_ETAT_RESS)
{
#ifdef GENERATE_GUI
DoMethod(App->ListEtats,MUIM_List_Redraw,RefreshParam);
#endif
}
if (RefreshType==RFH_MESSAGEBOX)
{
#ifdef GENERATE_GUI
switch(RefreshParam)
{
case 0:
set(App->MessageTextNum0,MUIA_String_Contents,MessagesBox[RefreshParam]);
set(App->MessageTextNum0,MUIA_String_BufferPos,0);
break;
case 1:
set(App->MessageTextNum1,MUIA_String_Contents,MessagesBox[RefreshParam]);
set(App->MessageTextNum1,MUIA_String_BufferPos,0);
break;
case 2:
set(App->MessageTextNum2,MUIA_String_Contents,MessagesBox[RefreshParam]);
set(App->MessageTextNum2,MUIA_String_BufferPos,0);
break;
case 3:
set(App->MessageTextNum3,MUIA_String_Contents,MessagesBox[RefreshParam]);
set(App->MessageTextNum3,MUIA_String_BufferPos,0);
break;
case 4:
set(App->MessageTextNum4,MUIA_String_Contents,MessagesBox[RefreshParam]);
set(App->MessageTextNum4,MUIA_String_BufferPos,0);
break;
case 5:
set(App->MessageTextNum5,MUIA_String_Contents,MessagesBox[RefreshParam]);
set(App->MessageTextNum5,MUIA_String_BufferPos,0);
break;
case 6:
set(App->MessageTextNum6,MUIA_String_Contents,MessagesBox[RefreshParam]);
set(App->MessageTextNum6,MUIA_String_BufferPos,0);
break;
case 7:
set(App->MessageTextNum7,MUIA_String_Contents,MessagesBox[RefreshParam]);
set(App->MessageTextNum7,MUIA_String_BufferPos,0);
break;
}
#else
printf("Message n°%d => %s\n",RefreshParam,MessagesBox[RefreshParam]);
#endif
/* Dernière boite aux lettres ? */
if (RefreshParam==NBR_MESSAGESBOX-1)
{
*EndOfStep=TRUE;
}
}
if (RefreshType==RFH_TRACE)
{
/* Plus de traces (dépassement capacité télétrans en nbr de traces)? */
if (RefreshParam==0)
{
*EndOfStep=TRUE;
}
else
{
#ifdef GENERATE_GUI
refresh_trace_wanted(RefreshParam,NULL);
#endif
}
}
RefreshType=0;
}
/* ######################################### */
/* # GESTION DU DIALOGUE AVEC LA TELETRANS # */
/* ######################################### */
void gestion_dialogue(int NewConnexion)
{
static int Step=0;
static char StepFirstPassage=TRUE;
static char StepDone=FALSE;
static char WaitingResponse=FALSE;
static char ParamSiteSaved=FALSE;
static char CurrentRequest[64];
static int CurrentRequestLgt;
static int LgtTrameRecue;
static unsigned long LaunchTime;
static int BaseTimeOut;
int TrameReponseOk;
static int CurrentAttemps;
static int NumRessALire;
char NumRessALireStr[16];
static char FirstJournalLoading=TRUE;
char NumEvenStr[16];
if (NewConnexion)
{
Step=0;
StepFirstPassage=TRUE;
StepDone=FALSE;
WaitingResponse=FALSE;
ParamSiteSaved=FALSE;
FirstJournalLoading=TRUE;
}
if ( (WaitingResponse) || (StepDone) )
{
/* On attend la réponse ... */
if (WaitingResponse)
{
TrameReponseOk=receive_request_trsii(CurrentRequest,CurrentRequestLgt,&LaunchTime,&CurrentAttemps,TrameRecue,&LgtTrameRecue,BaseTimeOut);
if (TrameReponseOk==TRUE)
{
WaitingResponse=FALSE;
gestion_refresh(&StepDone,&ParamSiteSaved,StepFirstPassage);
StepFirstPassage=FALSE;
}
}
/* Etape Terminée ? => Nouvelle étape */
if ( (StepDone)&&(!(WaitingResponse)) )
{
Step++;
StepFirstPassage=TRUE;
StepDone=FALSE;
/* Pas de lecture des libellés des ressources / du paramétrage des traces */
/* si sauvés sur disque */
if ( ((Step==3)||(Step==4)) && (ParamSiteSaved==TRUE) )
{
Step=5;
}
/* Pas de récupération des messages si pas choisi dans préférences */
if ( (Step==5) && (!(RecupDesMessages)) )
{
Step++;
}
/* On ne peut pas récupérer le journal avec un Force + choix dans préférences */
if ( (Step==8) && ( (Teletrans.TRSII_Extended_Clip==FALSE)||(!(RecupDuJournal)) ) )
{
Step++;
}
/* On ne récupère pas les traces avec un Force */
if ( (Step==10) && (!RecupDesTraces||(Teletrans.TRSII_Extended_Clip==FALSE)) )
{
Step++;
}
if (Step==11)
{
#ifndef GENERATE_GUI
for(NumRessALire=0;NumRessALire<20;NumRessALire++)
{
printf("Ress:%d => %s \t %s\n",NumRessALire,Ress[NumRessALire].Libelle,Ress[NumRessALire].Etat);
}
printf("Raccroche...\n");
hangup_modem();
TeletransOnLine=FALSE;
#else
Step=7;
#endif
}
}
}
else
{
/* On pose une nouvelle question ! */
switch(Step)
{
case 0:
/* FORCAGE MODE TRSII */
/* ------------------ */
send_request_trsii(CurrentRequest,&CurrentRequestLgt,"OTHER","W06","",&LaunchTime,&BaseTimeOut);
Delay(20);
Step++;
break;
case 1:
/* PASSAGE CODE D'ACCES */
/* -------------------- */
send_request_trsii(CurrentRequest,&CurrentRequestLgt,"ACCES",Teletrans.Password,"",&LaunchTime,&BaseTimeOut);
CurrentAttemps=3;
LgtTrameRecue=0;
WaitingResponse=TRUE;
StepDone=TRUE;
break;
case 2:
/* DEMANDE IDENTITE STATION */
/* ------------------------ */
send_request_trsii(CurrentRequest,&CurrentRequestLgt,"IDENT?","","",&LaunchTime,&BaseTimeOut);
CurrentAttemps=3;
LgtTrameRecue=0;
WaitingResponse=TRUE;
StepDone=TRUE;
break;
case 3:
/* LECTURE LIBELLES RESSOURCES */
/* --------------------------- */
if (StepFirstPassage==TRUE)
{
NumRessALire=0;
}
else
{
NumRessALire++;
}
sprintf(NumRessALireStr,"%0d",NumRessALire);
send_request_trsii(CurrentRequest,&CurrentRequestLgt,"RESS?",NumRessALireStr,"",&LaunchTime,&BaseTimeOut);
CurrentAttemps=3;
LgtTrameRecue=0;
WaitingResponse=TRUE;
break;
case 4:
/* LECTURE PARAMETRAGE TRACES */
/* -------------------------- */
if (StepFirstPassage==TRUE)
{
NumRessALire=1;
}
else
{
NumRessALire++;
}
sprintf(NumRessALireStr,"%0d",NumRessALire);
send_request_trsii(CurrentRequest,&CurrentRequestLgt,"TP?",NumRessALireStr,"",&LaunchTime,&BaseTimeOut);
CurrentAttemps=3;
LgtTrameRecue=0;
WaitingResponse=TRUE;
break;
case 5:
/* LECTURE DES MESSAGES DE LA BOITE */
/* -------------------------------- */
if (StepFirstPassage==TRUE)
{
NumRessALire=0;
}
else
{
NumRessALire++;
}
sprintf(NumRessALireStr,"%0d",NumRessALire);
send_request_trsii(CurrentRequest,&CurrentRequestLgt,"MESS?",NumRessALireStr,"",&LaunchTime,&BaseTimeOut);
CurrentAttemps=3;
LgtTrameRecue=0;
WaitingResponse=TRUE;
break;
case 6:
/* DEMANDE DATE LOCALE */
/* ------------------- */
send_request_trsii(CurrentRequest,&CurrentRequestLgt,"DATE?","","",&LaunchTime,&BaseTimeOut);
CurrentAttemps=3;
LgtTrameRecue=0;
WaitingResponse=TRUE;
StepDone=TRUE;
break;
case 7:
/* DEMANDE HEURE LOCALE */
/* ------------------- */
send_request_trsii(CurrentRequest,&CurrentRequestLgt,"TIME?","","",&LaunchTime,&BaseTimeOut);
CurrentAttemps=3;
LgtTrameRecue=0;
WaitingResponse=TRUE;
StepDone=TRUE;
break;
case 8:
/* LECTURE DU JOURNAL */
/* ------------------ */
/* On ne connait aucun événement ? */
if (NumLastEven_Journal==-1)
{
send_request_trsii(CurrentRequest,&CurrentRequestLgt,"J?","","",&LaunchTime,&BaseTimeOut);
}
else
{
if (FirstJournalLoading)
{
/* On veut l'événement suivant la date du dernier événement connu */
/* On reçoit un "Token incorrect" si jamais il y a un trou dans les index */
/* d'événements en passant par la commande J? #index */
send_request_trsii(CurrentRequest,&CurrentRequestLgt,"J?",DateLastEven_Journal,"",&LaunchTime,&BaseTimeOut);
FirstJournalLoading=FALSE;
}
else
{
/* On veux l'événement suivant LastNumEven */
/* Attention, numéro d'événement sur 4 caractères!!! */
NumEvenStr[0]='#';
RealToStrWithZeros(NumEvenStr+1,4,NumLastEven_Journal);
send_request_trsii(CurrentRequest,&CurrentRequestLgt,"J?",NumEvenStr,"",&LaunchTime,&BaseTimeOut);
}
}
CurrentAttemps=3;
LgtTrameRecue=0;
WaitingResponse=TRUE;
break;
case 9:
/* LECTURE ETATS DES RESSOURCES */
/* ---------------------------- */
if (StepFirstPassage==TRUE)
{
NumRessALire=-1;
}
do
{
NumRessALire++;
}
while( (Ress[NumRessALire].Libelle[0]=='\0') && (NumRessALire<(Teletrans.NumRessourcesMax-1)) );
if (NumRessALire<Teletrans.NumRessourcesMax)
{
sprintf(NumRessALireStr,"%0d",NumRessALire);
send_request_trsii(CurrentRequest,&CurrentRequestLgt,"ETAT?",NumRessALireStr,"",&LaunchTime,&BaseTimeOut);
CurrentAttemps=3;
LgtTrameRecue=0;
WaitingResponse=TRUE;
}
else
{
StepDone=TRUE;
}
break;
case 10:
/* LECTURE DES TRACES */
/* ------------------- */
if (StepFirstPassage==TRUE)
{
NumRessALire=0;
}
do
{
NumRessALire++;
}
while( (Tra[NumRessALire].Used!='M') && (NumRessALire<(Teletrans.NumTracesMax-1)) );
if (NumRessALire<Teletrans.NumTracesMax-1)
{
sprintf(NumRessALireStr,"%0d",NumRessALire);
send_request_trsii(CurrentRequest,&CurrentRequestLgt,"T?",NumRessALireStr,"",&LaunchTime,&BaseTimeOut);
CurrentAttemps=3;
LgtTrameRecue=0;
WaitingResponse=TRUE;
}
else
{
StepDone=TRUE;
}
break;
}
}
}
/*-----------------------------*/
/* MAIN */
/*-----------------------------*/
int main(int argc, char *argv[])
{
char Quitter=FALSE;
#ifdef GENERATE_GUI
ULONG signal;
char *StrContents;
#endif
char InitStringForModem[128]="";
int Result;
unsigned long StartTimeOfCnx=0;
char TimeOfCnxString[10+50];
int TimeOfCnx=0;
int TimeOfCnx_bak=0;
char tmp[50];
char tmp2[50];
char * AboutMsg;
char SignalConnexion=FALSE;
Mem_AllocAll();
IntuitionBase = (struct Library *)OpenLibrary("intuition.library",37);
if (!IntuitionBase)
exit(5);
GfxBase = (struct Library *)OpenLibrary("graphics.library",37);
if (!GfxBase)
exit(5);
UtilityBase = (struct Library *)OpenLibrary("utility.library",37);
if (!UtilityBase)
exit(5);
/* Lecture des préférences */
ReadStringParamIni("DEVICE","serial.device",SerialDevice,"ENV:ClipWatch.prefs");
SerialUnit=ReadIntParamIni("UNIT",0,"ENV:ClipWatch.prefs");
SerialSpeed=ReadIntParamIni("SPEED",1200,"ENV:ClipWatch.prefs");
ReadStringParamIni("INITSTRINGMODEM","",InitStringForModem,"ENV:ClipWatch.prefs");
RecupDuJournal=ReadIntParamIni("GETLOG",TRUE,"ENV:ClipWatch.prefs");
RecupDesMessages=ReadIntParamIni("GETMSG",TRUE,"ENV:ClipWatch.prefs");
RecupDesTraces=ReadIntParamIni("GETTRA",TRUE,"ENV:ClipWatch.prefs");
MoniteurActif=ReadIntParamIni("MONITOR",FALSE,"ENV:ClipWatch.prefs");
MoniteurMode=ReadIntParamIni("MONITORTYPE",1,"ENV:ClipWatch.prefs");
strcpy(Teletrans.SiteName,"");
TraceGraph.Horodates=NULL;
TraceGraph.Valeurs=NULL;
TraceGraph.NbrSamples=0;
#ifdef GENERATE_GUI
init();
if (!(mccgraph = MUI_CreateCustomClass(NULL,MUIC_Area,NULL,sizeof(struct GraphClassData),MyDispatcher)))
{
printf(NULL,"Could not create custom class.");
Mem_FreeAll();
exit(30);
}
App=CreateApp();
/* Réglage par défaut pour la visualisation de la trace calé sur la date du jour */
/* (j'ai vu le côté exploitation dans une entreprise...) */
convert_long_to_asciidate(timenow()-23*3600,tmp,tmp2);
set(App->Trace_DateStart,MUIA_String_Contents,tmp);
set(App->Trace_TimeStart,MUIA_String_Contents,tmp2);
AffiGraphGene.Time32Deb=timenow()-23*3600;
convert_long_to_asciidate(timenow()+3600,tmp,tmp2);
set(App->Trace_DateEnd,MUIA_String_Contents,tmp);
set(App->Trace_TimeEnd,MUIA_String_Contents,tmp2);
AffiGraphGene.Time32Fin=timenow()+3600;
set(App->GraphTrace,SHOW_GRAPH,&TraceGraph);
MiseAJourListeSitesConnus();
#endif
Serial_OpenAll();
do
{
#ifndef GENERATE_GUI
printf("N° de téléphone de la télétrans à appeler:");
scanf("%s",Teletrans.NumTel);
if (strcmp(Teletrans.NumTel,"x")==0)
{
Quitter = TRUE;
}
if (Quitter==FALSE)
{
printf("Mot de passe:");
scanf("%s",Teletrans.Password);
if ((SerialInitOk==TRUE)&&(strlen(Teletrans.NumTel)>0))
{
/* INIT.MODEM WITH INIT.STRING */
/* --------------------------- */
DisplayStatus("Init.modem");
if (init_modem(InitStringForModem)==FALSE)
{
ErrorMessageRequest("Init.modem failed");
}
else
{
int ResultCall;
/* CALLING THE SITE AND ESTABLISHING THE LINE */
/* ------------------------------------------ */
DisplayStatus("Calling...");
call_modem(Teletrans.NumTel,TRUE);
do
{
ResultCall = call_modem(Teletrans.NumTel,FALSE);
Delay(50);
}
while(ResultCall==FALSE);
if (ResultCall!=TRUE)
{
hangup_modem();
ErrorMessageRequest("Failed to connect");
}
else
{
TeletransOnLine=TRUE;
gestion_dialogue(TRUE);
do
{
gestion_dialogue(FALSE);
Delay(3);
}
while(TeletransOnLine);
}
}
}
Delay(240);
Quitter=TRUE;
}
#else
switch (DoMethod(App->App,MUIM_Application_Input,&signal))
{
case MUIV_Application_ReturnID_Quit:
Quitter = TRUE;
break;
case ID_MENU_ABOUT:
AboutMsg=malloc(4000);
if (AboutMsg)
{
sprintf(AboutMsg,"ClipWatch %s\nDernière révision:%s\n\nOutil pour appeler des télétransmissions Clip/Force (WIT)\n© 1999-2000 Marc Le Douarain\nmavati@club-internet.fr",VERSION,COMPILATION_DATE);
MUI_Request(App->App, App->WI_Main, 0, NULL, "OK", AboutMsg);
free(AboutMsg);
}
break;
case ID_MENU_ABOUTMUI:
if(!WI_AboutMUI)
WI_AboutMUI=AboutmuiObject,MUIA_Window_RefWindow,App->WI_Main,MUIA_Aboutmui_Application,App->App,End;
if(WI_AboutMUI)
set(WI_AboutMUI,MUIA_Window_Open,TRUE);
else
DisplayBeep(0);
break;
case ID_PREFS_WINDOWOPENED:
{
char SpdTmp[50];
char tmp[30];
set(App->Prefs_InitStringModem,MUIA_String_Contents,InitStringForModem);
set(App->Prefs_Device,MUIA_String_Contents,SerialDevice);
sprintf(tmp,"%d",SerialUnit);
set(App->Prefs_Unit,MUIA_String_Contents,tmp);
sprintf(SpdTmp,"%d",SerialSpeed);
set(App->Prefs_Vitesse,MUIA_Cycle_Active,GetMUICycleToSet(App->Prefs_VitesseContent,SpdTmp));
set(App->Prefs_RecupJournal,MUIA_Selected,RecupDuJournal);
set(App->Prefs_RecupMessages,MUIA_Selected,RecupDesMessages);
set(App->Prefs_RecupTraces,MUIA_Selected,RecupDesTraces);
set(App->Prefs_Monitor,MUIA_Selected,MoniteurActif);
set(App->Prefs_Monitor_Type,MUIA_Cycle_Active,MoniteurMode-1);
break;
}
case ID_PREFS_TOSAVE:
/* Sauvegarde des préférences sur le disque dur */
system("copy ENV:ClipWatch.prefs ENVARC:ClipWatch.prefs");
break;
case ID_PREFS_CHANGED:
{
long numcyc;
char * txt;
get(App->Prefs_InitStringModem,MUIA_String_Contents,&txt);
strcpy(InitStringForModem,txt);
get(App->Prefs_Device,MUIA_String_Contents,&txt);
strcpy(SerialDevice,txt);
get(App->Prefs_Unit,MUIA_String_Contents,&txt);
SerialUnit=atoi(txt);
get(App->Prefs_Vitesse,MUIA_Cycle_Active,&numcyc);
SerialSpeed=atoi(GetMUICycleString(App->Prefs_VitesseContent,numcyc));
get(App->Prefs_RecupJournal,MUIA_Selected,&RecupDuJournal);
get(App->Prefs_RecupMessages,MUIA_Selected,&RecupDesMessages);
get(App->Prefs_RecupTraces,MUIA_Selected,&RecupDesTraces);
get(App->Prefs_Monitor,MUIA_Selected,&MoniteurActif);
get(App->Prefs_Monitor_Type,MUIA_Cycle_Active,&MoniteurMode);
MoniteurMode++;
/* Sauvegarde des préférences en RAM */
WriteStringParamIni("DEVICE",SerialDevice,"ENV:ClipWatch.prefs");
WriteIntParamIni("UNIT",SerialUnit,"ENV:ClipWatch.prefs");
WriteIntParamIni("SPEED",SerialSpeed,"ENV:ClipWatch.prefs");
WriteStringParamIni("INITSTRINGMODEM",InitStringForModem,"ENV:ClipWatch.prefs");
WriteIntParamIni("GETLOG",RecupDuJournal,"ENV:ClipWatch.prefs");
WriteIntParamIni("GETMSG",RecupDesMessages,"ENV:ClipWatch.prefs");
WriteIntParamIni("GETTRA",RecupDesTraces,"ENV:ClipWatch.prefs");
WriteIntParamIni("MONITOR",MoniteurActif,"ENV:ClipWatch.prefs");
WriteIntParamIni("MONITORTYPE",MoniteurMode,"ENV:ClipWatch.prefs");
break;
}
case ID_MENU_PREFSMUI:
DoMethod(App->App,MUIM_Application_OpenConfigWindow,0);
break;
case ID_SAVED_SITE_SELECTED:
set(App->WI_SelectSite,MUIA_Window_Sleep,TRUE);
ChoixSiteConnu();
set(App->WI_SelectSite,MUIA_Window_Sleep,FALSE);
break;
case ID_BUTTON_DISCONNECT:
if ((TeletransOnLine)||(TeletransOnCall))
{
DisplayStatus("Raccroche...");
hangup_modem();
TeletransOnLine=FALSE;
TeletransOnCall=FALSE;
SignalConnexion=FALSE;
strcpy(TimeOfCnxString,"--:--");
set(App->ComTime,MUIA_Text_Contents,TimeOfCnxString);
DisplayStatus("Prêt...");
set(App->SelectSiteSaved,MUIA_Disabled,FALSE);
}
break;
case ID_BUTTON_CONNECT:
get(App->NumTelephone,MUIA_String_Contents,&StrContents);
strcpy(Teletrans.NumTel,StrContents);
get(App->Password,MUIA_String_Contents,&StrContents);
strcpy(Teletrans.Password,StrContents);
if ((SerialInitOk==TRUE)&&(strlen(Teletrans.NumTel)>0)&&(strlen(Teletrans.Password)>0))
{
/* INIT.MODEM WITH INIT.STRING - bloquant */
DisplayStatus("Init.modem");
if (init_modem(InitStringForModem)==FALSE)
{
ErrorMessageRequest("Echec Init.modem");
}
else
{
/* CALLING THE SITE AND ESTABLISHING THE LINE - non bloquant */
DisplayStatus("Appel...");
TeletransOnCall=TRUE;
call_modem(Teletrans.NumTel,TRUE);
}
}
else
{
ErrorMessageRequest("Numéro de téléphone/Mot de passe incorrects!!!");
}
break;
case ID_TRACE_REFRESH:
{
refresh_trace_wanted(0,NULL); // Refresh de la trace sélectionnée
break;
}
case ID_TRACE_START:
{
refresh_trace_wanted(0,ID_TRACE_START); // Refresh de la trace sélectionnée
break;
}
case ID_TRACE_END:
{
refresh_trace_wanted(0,ID_TRACE_END); // Refresh de la trace sélectionnée
break;
}
case ID_TRACE_RANGEDOWN:
{
refresh_trace_wanted(0,ID_TRACE_RANGEDOWN); // Refresh de la trace sélectionnée
break;
}
case ID_TRACE_RANGEUP:
{
refresh_trace_wanted(0,ID_TRACE_RANGEUP); // Refresh de la trace sélectionnée
break;
}
case ID_TRACE_NEWRANGE:
{
refresh_trace_wanted(0,ID_TRACE_NEWRANGE); // Refresh de la trace sélectionnée
break;
}
}
/* Gestion communication en cours */
if (TeletransOnLine)
{
gestion_dialogue(FALSE);
/* Le petit compteur du temps */
TimeOfCnx=get_timer_secs()-StartTimeOfCnx;
if (TimeOfCnx!=TimeOfCnx_bak)
{
sprintf(TimeOfCnxString,"%d:%2d",TimeOfCnx/60,TimeOfCnx%60);
set(App->ComTime,MUIA_Text_Contents,TimeOfCnxString);
TimeOfCnx_bak=TimeOfCnx;
}
if (!SignalConnexion)
set(App->SelectSiteSaved,MUIA_Disabled,TRUE);
SignalConnexion=TRUE;
}
/* On vient de se déconnecter suite à des erreurs... */
if ( (TeletransOnLine==FALSE) && (SignalConnexion==TRUE) )
{
ErrorMessageRequest("Perte de connexion avec le site...");
strcpy(TimeOfCnxString,"--:--");
set(App->ComTime,MUIA_Text_Contents,TimeOfCnxString);
DisplayStatus("Prêt...");
set(App->SelectSiteSaved,MUIA_Disabled,FALSE);
SignalConnexion=FALSE;
}
/* Gestion de l'appel en cours */
if (TeletransOnCall)
{
Result=call_modem(Teletrans.NumTel,FALSE);
if ( (Result!=FALSE) && (Result!=TRUE) )
{
hangup_modem();
if (Result==3)
ErrorMessageRequest("Ligne téléphonique du site occupée");
else
ErrorMessageRequest("Echec à l'appel");
TeletransOnCall=FALSE;
}
if (Result==TRUE)
{
TeletransOnCall=FALSE;
TeletransOnLine=TRUE;
StartTimeOfCnx=get_timer_secs();
gestion_dialogue(TRUE);
}
}
// if (!(Quitter) && signal)
// Wait(signal);
Delay(3);
#endif
}
while(Quitter==FALSE);
Appli_CloseAll();
#ifdef GENERATE_GUI
if (App)
{
DisposeApp(App);
MUI_DeleteCustomClass(mccgraph);
CloseLibrary(MUIMasterBase);
}
#endif
if (!IntuitionBase)
CloseLibrary(IntuitionBase);
if (!GfxBase)
CloseLibrary(GfxBase);
if (!UtilityBase)
CloseLibrary(UtilityBase);
Mem_FreeAll();
free_trace(&TraceGraph.Horodates,&TraceGraph.Valeurs);
exit(0);
}